package testes;

import controle.CControle;
import malha.*;

public class CControleTeste {
	
	//Testa funcao floatEquals
	private void testeFloatEquals(){
		assert(!CControle.floatEquals(-2, 2));
		assert(!CControle.floatEquals(1, 1.1f));
		assert(CControle.floatEquals(1, 1.09f));
		
	}
	
	//Testa funcao bhaskara
	private void testeBhaskara(){
		float [] raiz0 = CControle.bhaskara(4, 3, -1);
		assert(raiz0[0] == 0.25);
		assert(raiz0[1] == -1);
		
		float raiz1[] = CControle.bhaskara(2, -2, -2);
		assert(CControle.floatEquals(raiz1[0], 1.618f));
		assert(CControle.floatEquals(raiz1[1], -0.618f));
	}
	
	//Testa funcao calculaTempoAteChave
	private void testeCalculaTempoAteChave(){
		
		CComposicao comp1 = new CComposicao("trem1");
		comp1.setAcelAtual(0);
		comp1.setVelAtual(10);
		comp1.setAcelMax(30);
		comp1.setPosicaoAtual(220);
		comp1.setMovendoAParaB(false);
		CTrecho trecho1 = new CTrecho("trecho1");
		trecho1.setDistancia(440);
		comp1.setTrechoChaveAtual(trecho1);
		int tempo1 = CControle.calculaTempoAteChave(comp1, true);
		assert(tempo1 == 3);
		
		CComposicao comp2 = new CComposicao("trem2");
		comp2.setAcelAtual(0);
		comp2.setVelAtual(10);
		comp2.setAcelMax(30);
		comp2.setPosicaoAtual(220);
		comp2.setMovendoAParaB(true);
		CTrecho trecho2 = new CTrecho("trecho2");
		trecho2.setDistancia(440);
		comp2.setTrechoChaveAtual(trecho2);
		int tempo2 = CControle.calculaTempoAteChave(comp2, true);
		assert(tempo2 == 3);
		
	}
	
	private void testecalculaAceleracaoNoTempo(){
		CComposicao comp0 = new CComposicao("trem0");
		comp0.setVelAtual(0);
		comp0.setAcelMax(50);
		comp0.setPosicaoAtual(100);
		comp0.setMovendoAParaB(false);
		float accel0 = CControle.calculaAceleracaoNoTempo(comp0, 2);
		assert(CControle.floatEquals(50f, accel0));
		
		CComposicao comp1 = new CComposicao("trem1");
		comp1.setVelAtual(0);
		comp1.setAcelMax(50);
		comp1.setPosicaoAtual(100);
		comp1.setMovendoAParaB(true);
		CElementoTrilho trecho1 = new CTrecho("trecho1");
		trecho1.setDistancia(200);
		comp1.setTrechoChaveAtual(trecho1);
		float accel1 = CControle.calculaAceleracaoNoTempo(comp1, 2);
		assert(CControle.floatEquals(50f, accel1));
		
		CComposicao comp2 = new CComposicao("trem2");
		comp2.setVelAtual(0);
		comp2.setAcelMax(50);
		comp2.setPosicaoAtual(100);
		comp2.setMovendoAParaB(true);
		CElementoTrilho trecho2 = new CTrecho("trecho2");
		trecho2.setDistancia(200);
		comp2.setTrechoChaveAtual(trecho2);
		float accel2 = CControle.calculaAceleracaoNoTempo(comp2, 1);
		assert(CControle.floatEquals(200f, accel2));
		
		CComposicao comp3 = new CComposicao("trem3");
		comp3.setVelAtual(110);
		comp3.setAcelMax(50);
		comp3.setPosicaoAtual(100);
		comp3.setMovendoAParaB(true);
		CElementoTrilho trecho3 = new CTrecho("trecho3");
		trecho3.setDistancia(200);
		comp3.setTrechoChaveAtual(trecho3);
		float accel3 = CControle.calculaAceleracaoNoTempo(comp3, 1);
		assert(CControle.floatEquals(-20f, accel3));
		
		CComposicao comp4 = new CComposicao("trem4");
		comp4.setVelAtual(110);
		comp4.setAcelMax(50);
		comp4.setPosicaoAtual(100);
		comp4.setMovendoAParaB(false);
		CElementoTrilho trecho4 = new CTrecho("trecho4");
		trecho4.setDistancia(200);
		comp4.setTrechoChaveAtual(trecho4);
		float accel4 = CControle.calculaAceleracaoNoTempo(comp4, 1);
		assert(CControle.floatEquals(-20f, accel4));
		
	}
	
	public static void main(String args[]){
		CControleTeste teste = new CControleTeste();
		CControle controle = CControle.getControle();
		
		teste.testeFloatEquals();
		teste.testeBhaskara();
		teste.testeCalculaTempoAteChave();
		teste.testecalculaAceleracaoNoTempo();
		
		System.out.println("Teste Finalizado");
	}
	
}
